package hyl.base.cache2;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;

import hyl.core.data.ACValue;
import hyl.core.data.IMap;


/**
 * 可回收式map 无cache 适用于 特殊场景
 * 
 * 主要是把不用的map key 移到另一个map中 ,等用时再载入
 * 
 * 把删除的Map的ACValue对象 移入回收站,
 * 
 * 删除对象的空间会被重复利用,而ACValue对象的绑定数据被丢弃,
 * 
 * 然后等待下次add时,从回收站中取出ACValue对象,替换ACValue对象中的绑定物
 * 
 * 用途是避免了新建对象时重新分配空间的耗时
 */
public class RecMap<T> implements IMap<String, T> {
	private Map<String, ACValue<T>> _map = new ConcurrentHashMap<>();
	private ConcurrentLinkedQueue<ACValue<T>> _recycle = new ConcurrentLinkedQueue<>();

	public ACValue<T> createTimeValue(String key, T value) {
		return new ACValue<T>(key, value);
	}

	@Override
	public synchronized T get(String key) {
		ACValue<T> ti = _map.get(key);
		if (ti == null)
			return null;
		return (T) ti.value();
	}

	public Map<String, ACValue<T>> getAll() {
		return _map;
	}

	@Override
	public synchronized T put(String key, T value) {
		ACValue<T> tv;
		if (_recycle.isEmpty())
			tv = new ACValue<T>(key, value);
		else {
			tv = (ACValue<T>) _recycle.poll();
			tv.set(key, value);
		}
		_map.put(key, tv);
		return value;

	}

	@Override
	public synchronized T remove(String key) {
		ACValue<T> tv = _map.get(key);
		if (tv == null)
			return null;
		_recycle.offer(tv);
		_map.remove(key);
		return tv.getValue();

	}

	@Override
	public boolean containsKey(String key) {
		return _map.containsKey(key);
	}

	@Override
	public void clear() {
		_map.clear();
		_recycle.clear();
	}
}
